package com.jkgj.skykingkong.tms.domain.model.rbac;

import com.jkgj.skykingkong.tms.domain.model.DomainRegistry;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.Validate;
import org.springframework.data.ebean.domain.AbstractAuditableEntity;
import org.springframework.data.ebean.domain.AggregateRoot;

import javax.persistence.*;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Xuegui Yuan
 */
@Getter
@Setter
@Entity
@Table(name = "sys_user")
@AggregateRoot
public class User extends AbstractAuditableEntity {
  /**
   * 用户名
   */
  private String username;

  /**
   * 手机号
   */
  private String mobile;

  /**
   * 邮箱
   */
  private String email;

  /**
   * 姓名
   */
  private String name;

  /**
   * 密码
   */
  private String password;

  /**
   * 是否管理员
   */
  private boolean isAdmin;

  /**
   * 是否可用
   */
  private boolean isEnabled;

  /**
   * 医院name
   */
  private String hospitalName;

  /**
   * 角色列表
   */
  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(name = "sys_user_role", joinColumns = {@JoinColumn(name = "user_id")}, inverseJoinColumns = {
      @JoinColumn(name = "role_id")})
  private List<Role> roles;

  public User(String username, String password, String mobile, String email, String name) {
    this.setUsername(username);
    this.setPassword(DomainRegistry.passwordEncoder().encode(password));
    this.setMobile(mobile);
    this.setEmail(email);
    this.setName(name);
  }

  /**
   * 获取拥有的所有角色代码
   */
  public Set<String> getRoleCodes() {
    return getRoles().stream().map(r -> r.getCode()).collect(Collectors.toSet());
  }

  /**
   * 获取拥有的所有权限代码
   */
  public Set<String> getPermissionCodes() {
    Set<String> permissions = new HashSet<>();
    getRoles().stream().forEach(
        r -> {
          permissions.addAll(r.getPermissionCodes());
        }
    );
    return permissions;
  }

  /**
   * 分配角色
   *
   * @param roles
   */
  public void grantRoles(List<Role> roles) {
    this.getRoles().clear();
    this.getRoles().addAll(roles);
  }

  /**
   * 可用
   */
  public void enable() {
    this.setEnabled(true);
  }

  /**
   * 禁用
   */
  public void disable() {
    this.setEnabled(false);
  }

  public void changePassword(String aChangedPassword) {
    Validate.notBlank(aChangedPassword, "密码不能为空");
    this.setPassword(DomainRegistry.passwordEncoder().encode(aChangedPassword));
  }

}
